package com.example.common;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.example.entity.Admin;
import com.example.entity.Log;
import com.example.service.LogService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

@Component
@Aspect
public class LogAspect {
    @Resource
    private LogService logService;

    @Around("@annotation(autoLog)")
    public Object doAround(ProceedingJoinPoint joinPoint, AutoLog autoLog) throws Throwable {
        String operationName = autoLog.value(); // 操作名称（例如 "用户登录"）
        String time = DateUtil.now(); // 操作时间
        String username = ""; // 用户名
        String ip = ""; // IP地址

        // 执行目标方法（如登录、注册等）
        Result result = (Result) joinPoint.proceed();

        // 获取请求对象（必须在 proceed() 之后获取，避免线程问题）
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        ip = request.getRemoteAddr();

        // 根据操作类型获取用户名
        if ("用户登录".equals(operationName)) {
            // 1. 登录操作：从返回结果或参数中提取用户名
            Object data = result.getData();
            if (data instanceof Admin) {
                // 登录成功：从返回的 Admin 对象获取用户名
                Admin admin = (Admin) data;
                username = admin.getName();
            } else {
                // 登录失败：从方法参数中获取用户名
                Object[] args = joinPoint.getArgs();
                for (Object arg : args) {
                    if (arg instanceof Admin) {
                        Admin adminArg = (Admin) arg;
                        username = adminArg.getName();
                        break;
                    }
                }
            }
        } else {
            // 2. 其他操作：从 Token 中获取用户名
            Admin user = JwtTokenUtils.getCurrentUser();
            if (ObjectUtil.isNotNull(user)) {
                username = user.getName();
            }
        }

        // 记录日志
        Log log = new Log(null, operationName, time, username, ip);
        logService.add(log);

        return result;
    }
}